/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import bsh.EvalError;
import bsh.Interpreter;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import stendcontrol.Param;

/**
 *
 * @author minaev
 */
public class ParamInterpreterInputer {

    private Interpreter inter;
    private ArrayList<Param> inputs = new ArrayList<Param>();
    private ArrayList<String> var_names = new ArrayList<String>();
    private ArrayList<Integer> var_types = new ArrayList<Integer>();
    public static final int T_INTEGER = 0;
    public static final int T_FLOAT = 1;
    private boolean inputDispose = false;

    public ParamInterpreterInputer(Interpreter inter) {
        this.inter = inter;
    }

    /**
     * Объявление параметра ввода
     *
     * @param name - имя, отображаемое для ввода
     * @param type - тип параметра T_INTEGER
     * @param var_name
     * @param def
     */
    public void input(String name, int type, String var_name, double def) {
        inputs.add(new Param(name, Param.P_OTHER, def));
        var_names.add(var_name);
        var_types.add(type);
    }

    public void input(String name, int type, String var_name, int def) {
       input(name, type, var_name,(double)def);
    }
    
    public void input(int type, String var_name, int def) {
       input(type, var_name,(double)def);
    }
    
    public void input(int type, String var_name, double def) {
       input(" " + var_name + " >",type, var_name, def);
    }
    
    public void input(String name, int type, String var_name) {
        input(name, type, var_name, 0);
    }

    public void input(int type, String var_name) {
       input(type, var_name, 0);
    }

    public synchronized void setInputs() {



        //showInputFrame();


        new Thread(new Runnable() {
            @Override
            public void run() {
                showInputFrame();
            }
        }).start();

        //        new Thread(new Runnable() {
        //            @Override
        //            public void run() {
        //            }
        //        }).start();
        //        try {
        //            System.out.println("wait..");
        //            this.wait();
        //        } catch (InterruptedException ex) {
        try {     //        }
            this.wait();
        } catch (InterruptedException ex) {
            Logger.getLogger(ParamInterpreterInputer.class.getName()).log(Level.SEVERE, null, ex);
        }
        //        while (!inputDispose) {
        //            try {
        //                Thread.sleep(200);
        //                System.out.println("wait...");
        //            } catch (InterruptedException ex) {
        //                System.out.println(ex.getMessage());
        //            }


        clear();

    }

    public void clear() {
        input_fields.clear();
        inputs.clear();
        var_names.clear();
        var_types.clear();
    }
    private Frame input_frame;
    private ArrayList<JTextField> input_fields = new ArrayList<JTextField>();

    private synchronized void okAction(Window frm) {
        setInputsFromFields();
        frm.dispose();
        inputDispose = true;
        this.notify();

    }

    private synchronized void showInputFrame() {



        inputDispose = false;
        input_frame = new Frame("Ввод параметров");
        input_frame.setLocationRelativeTo(null);
        input_frame.setAlwaysOnTop(true);
        input_frame.addWindowListener(new WindowListener() {
            @Override
            public void windowClosing(WindowEvent e) {
                okAction(e.getWindow());
            }

            @Override
            public void windowOpened(WindowEvent e) {
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }

            @Override
            public void windowIconified(WindowEvent e) {
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
            }

            @Override
            public void windowActivated(WindowEvent e) {
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
            }
        });
        input_frame.setLayout(new java.awt.GridLayout(0, 2));
        addInputsComps(input_frame);
        input_frame.pack();

        input_frame.setVisible(true);
//        EventQueue.invokeLater(new Runnable() {
//            @Override
//            public void run() {
//                  input_frame.setVisible(true);  
//            }
//        });   

    }

    private void addInputsComps(final Frame frm) {
        for (int i = 0; i < inputs.size(); i++) {
            frm.add(new JLabel(inputs.get(i).getName()));
            input_fields.add(new JTextField(
                    Double.toString(inputs.get(i).getValue())));
            frm.add(input_fields.get(input_fields.size() - 1));
        }
        JButton ok_button = new JButton("OK");
        ok_button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                okAction(frm);

            }
        });
        frm.add(ok_button);
    }

    private void setInputsFromFields() {
        String str_val;
        for (int i = 0; i < input_fields.size(); i++) {
            str_val = input_fields.get(i).getText();
            switch (var_types.get(i)) {
                case T_INTEGER: {
                    try {
                        if (str_val.contains(".")) {
                            str_val = str_val.substring(0,
                                    str_val.indexOf('.'));
                        }
                        inter.set(var_names.get(i),
                                Integer.valueOf(str_val));
                    } catch (EvalError ex) {
                        inter.println("Невозможно установить целочисленную "
                                + "переменную "
                                + var_names.get(i) + "со значением "
                                + str_val + " сообщение: "
                                + ex.getMessage());
                    }
                    break;
                }
                case T_FLOAT: {
                    try {
                        inter.set(var_names.get(i),
                                Double.valueOf(str_val));
                    } catch (EvalError ex) {
                        inter.println("Невозможно установить дробную "
                                + "переменную "
                                + var_names.get(i) + "со значением "
                                + str_val + " сообщение: "
                                + ex.getMessage());
                    }
                    break;
                }
            }
        }
    }
//    public double getFloatInput(int i) {
//        return inputs.get(i).getValue();
//    }
//
//    public int getIntegerInput(int i) {
//        return (int) Math.round(getFloatInput(i));
//    }
//
//    public double getFloatInput(String name) {
//        for (int i = 0; i < var_names.size(); i++) {
//            if (var_names.equals(name)) {
//                return getFloatInput(i);
//            }
//        }
//        return 0;
//    }
//
//    public int getIntegerInput(String name) {
//        return (int) Math.round(getFloatInput(name));
//    }
}
